package org.example.ExperimentFour.First;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflection {
    public static void main(String[] args) throws Exception {
//1）使用Class.forName()动态加载了Student类
        Class<?> studentClass=Class.forName("org.example.ExperimentFour.First.Student");
//2）使用反射机制创建 Student 类的实例.newInstance()方法创建了类的实例
//        无参构造
        Object studentInstance=studentClass.newInstance();
//       有参构造
        Class[] argTypes = new Class[]{String.class, int.class};
        Object[] argsForConstructor = new Object[]{"Tancan", 19};
        Object studentWithArgsConstructor = studentClass.getConstructor(argTypes).newInstance(argsForConstructor);
// 使用反射调用getName()和getAge()方法，并打印结果
        Method getNameMethod = studentClass.getMethod("getName");
        Method getAgeMethod = studentClass.getMethod("getAge");

        String name = (String) getNameMethod.invoke(studentWithArgsConstructor);
        int age = (int) getAgeMethod.invoke(studentWithArgsConstructor);

        System.out.println("修改前：Name: " + name + ", Age: " + age);
//3）使用反射机制访问和修改 Student 类的私有字段。
        Field nameField = studentClass.getDeclaredField("name");
        nameField.setAccessible(true); // 允许访问私有字段
        nameField.set(studentInstance, "TTTc"); // 修改实例的name字段
        System.out.println("修改名字为: " + nameField.get(studentInstance)); // 输出修改后的名字
   // 访问和修改  age
        Field ageField = studentClass.getDeclaredField("age");
        ageField.setAccessible(true); // 允许访问私有字段
        ageField.set(studentInstance, 21); // 修改实例的age字段
        System.out.println("修改年龄为: " + ageField.get(studentInstance)); // 输出修改后的年龄
//4）使用反射机制调用 Student 类的公共方法和私有方法。
        // 公共方法
        Method layInfoMethod = studentClass.getMethod("displayInfo");
        layInfoMethod.invoke(studentInstance); // 调用 displayInfo方法

        // 调用私有方法
        Method privateMethod = studentClass.getDeclaredMethod("privateMethod");
        privateMethod.setAccessible(true); // 允许访问私有方法
        privateMethod.invoke(studentInstance); // 调用 privateMethod
    }
}
